From: Jeroen van der Heijden Date: Mon, 1 Oct 2018 11:54:00 +0000 (+0200) Subject: Fix buffer X-Git-Tag: archive/raspbian/2.0.44-1+rpi1~1^2~3^2~8^2~49 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=0ae39e8fb1d3388df26e190a217cd425f96bc397;p=siridb-server.git Fix buffer --- diff --git a/src/siri/db/buffer.c b/src/siri/db/buffer.c index 2ab73cd8..bb3da76e 100644 --- a/src/siri/db/buffer.c +++ b/src/siri/db/buffer.c @@ -42,9 +42,7 @@ int siridb_buffer_write_empty( siridb_t * siridb, siridb_series_t * series) { - memcpy(siridb->buffer_clear, &buffer__start, sizeof(uint32_t)); memcpy(siridb->buffer_clear + 4, &series->id, sizeof(uint32_t)); - return ( /* go to the series position in buffer */ fseeko( siridb->buffer_fp, @@ -108,6 +106,10 @@ int siridb_buffer_new_series(siridb_t * siridb, siridb_series_t * series) int siridb_buffer_fsync(siridb_t * siridb) { + if (siridb->buffer_fp == NULL) + { + return 0; + } int buffer_fd = fileno(siridb->buffer_fp); return (buffer_fd != -1) ? fsync(buffer_fd) : -1; } @@ -200,6 +202,8 @@ int siridb_buffer_load(siridb_t * siridb) memcpy(pt, &buffer__end, sizeof(uint64_t)); } + memcpy(siridb->buffer_clear, &buffer__start, sizeof(uint32_t)); + siridb_misc_get_fn(fn, siridb->buffer_path, SIRIDB_BUFFER_FN) siridb_misc_get_fn(fn_temp, siridb->buffer_path, "__" SIRIDB_BUFFER_FN) diff --git a/test/test_ctree/test_ctree.c b/test/test_ctree/test_ctree.c index 27e12e2a..c370e6be 100644 --- a/test/test_ctree/test_ctree.c +++ b/test/test_ctree/test_ctree.c @@ -1,8 +1,8 @@ #include "../test.h" #include -const unsigned int num_entries = 14; -char * entries[] = { +static const unsigned int num_entries = 14; +static char * entries[] = { "Zero", "First entry", "Second entry", @@ -16,7 +16,7 @@ char * entries[] = { "entry 10", "entry 11", "entry 12", - "entry-last" + "entry-last", }; int main() diff --git a/test/test_imap/test_imap.c b/test/test_imap/test_imap.c index 00db4c43..a9f2c3d6 100644 --- a/test/test_imap/test_imap.c +++ b/test/test_imap/test_imap.c @@ -1,15 +1,163 @@ #include "../test.h" +#include #include +static const unsigned int num_entries = 14; +static char * entries[] = { + "Zero", + "First entry", + "Second entry", + "Third entry", + "Fourth entry", + "Fifth entry", + "Sixth entry", + "Seventh entry", + "8", + "9", + "entry 10", + "entry 11", + "entry 12", + "entry-last", +}; -int main() +typedef struct +{ + uint32_t ref; + uint32_t id; +} test_series_t; + +static test_series_t series_a = { + .ref=0, + .id=11 +}; +static test_series_t series_b = { + .ref=0, + .id=987 +}; +static test_series_t series_c = { + .ref=0, + .id=219 +}; +static test_series_t series_d = { + .ref=0, + .id=9 +}; +static test_series_t series_e = { + .ref=0, + .id=988 +}; + +static imap_t * imap_dst; +static imap_t * imap_tmp; + +static int test__imap_decref_cb(char * series) +{ + ((slist_object_t *) series)->ref--; + return 1; +} + +static int test__imap_id_count_cb( + char * series, + void * data __attribute__((unused))) +{ + return ((test_series_t *) series)->id; +} + +static void test__imap_setup(void) { - test_start("imap"); + imap_dst = imap_new(); + imap_tmp = imap_new(); + + imap_set(imap_dst, series_a.id, &series_a); + series_a.ref++; + + imap_set(imap_dst, series_b.id, &series_b); + series_b.ref++; + + imap_set(imap_dst, series_c.id, &series_c); + series_c.ref++; + + imap_set(imap_tmp, series_b.id, &series_b); + series_b.ref++; + + imap_set(imap_tmp, series_c.id, &series_c); + series_c.ref++; + + imap_set(imap_tmp, series_d.id, &series_d); + series_d.ref++; + + imap_set(imap_tmp, series_e.id, &series_e); + series_e.ref++; +} + +static int test_imap_add_set_get_pod(void) +{ + test_start("imap (add, set, get, pop)"); imap_t * imap = imap_new(); /* test is the length is correct */ + _assert (imap->len == 0); + + /* test imap_add */ + { + unsigned int i; + for (i=0; i < num_entries; i++) + { + _assert (imap_add(imap, i, entries[i]) == 0); + } + _assert (imap->len == num_entries); + } + + /* test imap_add duplicates */ { + unsigned int i; + for (i=0; i < num_entries; i++) + { + _assert (imap_add(imap, i, "duplicate") != 0); + } + } + + /* test imap_get */ + { + unsigned int i; + for (i=0; i < num_entries; i++) + { + _assert (imap_get(imap, i) == entries[i]); + } + } + + /* test imap_set */ + { + unsigned int i; + for (i=0; i < num_entries; i++) + { + unsigned int j = i * 2; + _assert (imap_set( + imap, j, entries[i]) == (int) (j < num_entries ? 0 : 1)); + } + + for (i=0; i < num_entries; i++) + { + unsigned int j = i * 2; + _assert (imap_get(imap, j) == entries[i]); + } + } + + /* test imap_pop */ + { + unsigned int i; + for (i=0; i < num_entries; i++) + { + unsigned int j = i * 2; + _assert (imap_pop(imap, j) == entries[i]); + } + + for (i=1; i < num_entries; i+=2) + { + _assert (imap_pop(imap, i) == entries[i]); + } + _assert (imap->len == 0); } @@ -17,3 +165,134 @@ int main() return test_end(); } + +static int test_imap_union() +{ + test_start("imap (union)"); + + test__imap_setup(); + + imap_union_ref( + imap_dst, + imap_tmp, + (imap_free_cb) test__imap_decref_cb); + + _assert (imap_dst->len == 5); + _assert (imap_walk( + imap_dst, + (imap_cb) &test__imap_id_count_cb, + NULL) == (int) ( + series_a.id + + series_b.id + + series_c.id + + series_d.id + + series_e.id)); + + imap_free(imap_dst, (imap_free_cb) test__imap_decref_cb); + + _assert (series_a.ref == 0); + _assert (series_b.ref == 0); + _assert (series_c.ref == 0); + _assert (series_d.ref == 0); + _assert (series_e.ref == 0); + + return test_end(); +} + +static int test_imap_intersection(void) +{ + test_start("imap (intersection)"); + + test__imap_setup(); + + imap_intersection_ref( + imap_dst, + imap_tmp, + (imap_free_cb) test__imap_decref_cb); + + _assert (imap_dst->len == 2); + _assert (imap_walk( + imap_dst, + (imap_cb) &test__imap_id_count_cb, + NULL) == (int) ( + series_b.id + + series_c.id)); + + imap_free(imap_dst, (imap_free_cb) test__imap_decref_cb); + _assert (series_a.ref == 0); + _assert (series_b.ref == 0); + _assert (series_c.ref == 0); + _assert (series_d.ref == 0); + _assert (series_e.ref == 0); + + return test_end(); +} + +static int test_imap_difference(void) +{ + test_start("imap (difference)"); + + test__imap_setup(); + + imap_difference_ref( + imap_dst, + imap_tmp, + (imap_free_cb) test__imap_decref_cb); + + _assert (imap_dst->len == 1); + _assert (imap_walk( + imap_dst, + (imap_cb) &test__imap_id_count_cb, + NULL) == (int) series_a.id); + + imap_free(imap_dst, (imap_free_cb) test__imap_decref_cb); + _assert (series_a.ref == 0); + _assert (series_b.ref == 0); + _assert (series_c.ref == 0); + _assert (series_d.ref == 0); + _assert (series_e.ref == 0); + + return test_end(); +} + +static int test_imap_symmetric_difference(void) +{ + test_start("imap (symmetric_difference)"); + + test__imap_setup(); + + imap_symmetric_difference_ref( + imap_dst, + imap_tmp, + (imap_free_cb) test__imap_decref_cb); + + _assert (imap_dst->len == 3); + _assert (imap_walk( + imap_dst, + (imap_cb) &test__imap_id_count_cb, + NULL) == (int) ( + series_a.id + + series_d.id + + series_e.id)); + + imap_free(imap_dst, (imap_free_cb) test__imap_decref_cb); + _assert (series_a.ref == 0); + _assert (series_b.ref == 0); + _assert (series_c.ref == 0); + _assert (series_d.ref == 0); + _assert (series_e.ref == 0); + + return test_end(); +} + +int main() +{ + return ( + test_imap_add_set_get_pod() || + test_imap_union() || + test_imap_intersection() || + test_imap_difference() || + test_imap_symmetric_difference() || + 0 + ); +}